<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 深拷贝在计算机中开辟一块新的内存地址用于存放复制的对象
        // 多层对象或者数组进行深拷贝
        function deepcopy(obj1) {
            // 根据传入的数据，自动生成 数组 或者 对象 
            var obj2 = Object.prototype.toString.call(obj1) === '[object Array]' ? [] : {};
            for (var key in obj1) {
                // 判断循环出来的属性是否为自身属性，不需要处理原型及原型链上的属性和方法
                if (obj1.hasOwnProperty(key)) {
                    if (typeof obj1[key] === "object") {
                        // 复杂数据类型 数组、对象
                        obj2[key] = deepcopy(obj1[key]);
                    } else {
                        obj2[key] = obj1[key]
                    }
                }
            }
            return obj2
        }

        Object.prototype.height = "178cm"; // 原始的对象上添加height属性
        var obj1 = {
            name: "张三",
            age: 20,
            hobby: {
                name1: "篮球",
                name2: "足球"
            }
        }

        var obj2 = deepcopy(obj1);
        console.log(obj2);
        obj2.hobby.name1 = "乒乓球";
        console.log(obj1);

        // for in  用来循环对象；可以循环原型链
        // Object.hasOwnProperty(key) ：可以判断 某个属性是否是对象自身的属性
        // console.log(obj1.hasOwnProperty("name"));

        // for (var key in obj1) {
        //     //    判断循环出来的属性是否是自身属性 ，不需要处理原型及原型链上的属性和方法
        //     if (obj1.hasOwnProperty(key)) {
        //         console.log(key);
        //     }
        // }


    </script>
</body>

</html>